<?php
namespace Api\Model;
use Think\Model;
class AccessTokenModel extends Model{
	public function get_access_token(){
        $access_obj = $this->field(true)->find(); //获取access_token表的所有字段
		$now = intval(time());					  //获取系统当前时间并且转化成整数
        if($access_obj && intval($access_obj['expires_in']) > ($now-7200)){		//access_token的有效期为2小时，用存进去的时间对比现在减去7200秒
        	return array('code' => 200, 'token' =>$access_obj['access_token']); //如果存进去的时间大于$now-7200说明没有过期
        }else{
        	$config=D('Config')->get_config();	//实例化config模型类 获取数据库小程序配置信息
        	$appid=$config['appid'];
        	$appsecret=$config['appsecret'];
        	$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
            $json = json_decode($this->curlGet($url));		//返回一个json格式的对象	
        	 if(isset($json->access_token) && $json->access_token){
                 if($access_obj){																									//如果access_token有数据，进行修改
                     $this->where(array('id'=>$access_obj['id']))->save(array('access_token'=>$json->access_token,'expires_in'=>$now)); //$this当前数据表模型
                 }else{																												//没有数据添加数据
                     $this->add(array('access_token'=>$json->access_token,'expires_in'=>$now));
                 }
                 return array('errcode' => 200, 'access_token' => $json->access_token);
             }else{
                 return array('errcode' => $json->errcode, 'access_token' => $json->errmsg);										//没有获取到token，返回错误信息
             }
        }
    }

    //与服务器交互curl
    public function curlGet($url){
    	 $ch=curl_init();   							//初始化curl资源
    	 $header = "Accept-Charset: utf-8";			//定义变量http表头信息
    	//参数设置请求的协议地址:curl_setopt()函数有三个参数、curl资源变量、curl参数选项、curl参数值
    	 curl_setopt($ch, CURLOPT_URL, $url);       //这个参数选项规定了请求的url地址
    	 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); //当进行HTTP请求时，传递一个字符被GET使用
    	 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  //CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST 两个参数改为false即忽略了证书
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
         curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); //CURLOPT_SSLVERSION 传递一个sll版本参数，CURL_SSLVERSION_TLSv1指定版本
         curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //这个参数又决定是是否处理http的头信息，我们不想接收处理的话可将这个值设置为
         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); //	在HTTP请求中包含一个"User-Agent: "头的字符串。
         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
         curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //若需要返回值即为1。不需请求后返回的结果可设置为0。
         $temp = curl_exec($ch); //如果执行的结果有数据。使用curl_exec执行后，会将结果返回给$temp变量。
         curl_close($ch);		 //curl_close关闭后立刻释放内存
         return $temp;
    }
}